<?php
namespace App\Admin\Export;

use App\User;
use Encore\Admin\Grid\Exporters\ExcelExporter;
use Maatwebsite\Excel\Concerns\WithMapping;

class UsersExport extends ExcelExporter implements  WithMapping
{

    protected $fileName = '医生管理.xlsx';

    protected $columns = [
        'name' => '姓名',
        'email' => '邮箱',
        'email_verified_at' => '邮箱认证时间',
        'created_at' => '注册时间',
    ];

    public function map($row): array
    {
        // TODO: Implement map() method.
        return [
            $row->name,
            substr($row->email, 0,8),
            strtotime($row->email_verified_at),
            $row->created_at
        ];
    }


    public function otherExport(){

        //为临时修改配置，脚本运行时保持新的值，并在脚本结束时恢复
        set_time_limit(0);//设置脚本最大执行时间,单位为S，默认30S；如果设置为0，没有时间方面的限制
        ini_set('memory_limit','1024M');//默认128M

        $filename = '用户明细'.date('Y-m-d').'csv';

        //设置头部信息，但是在设置之前，不能有任何实际输出。不管是普通的 HTML 标签，还是文件或 PHP 输出的空行，空格
        header('Cache-Control: public');
        header('Pragma: public');
        header('Content-type:application/vnd.ms-excel');
        header('Content-Disposition:attachment;filename=' . $filename);
        header('Content-Type:application/octet-stream');

        //excel表格的头部，即文件的第一行
        $header = [
            'name' => '姓名',
            'email' => '邮箱',
            'email_verified_at' => '邮箱认证时间',
            'created_at' => '注册时间',
        ];

        ob_start();// 打开输出控制缓冲

        $fp = fopen('php://output','a');//a:写入模式打开文件，并将指针指向文件末尾，文件不存在创建；此时打开的可以是具体的文件地址，也可以是scheme://...格式，php可以使用封装协议来处理此模式
        fputcsv($fp, $header);//将行格式化为CSV，并写入文件指针，前一步创建文件时，指针指向末尾，那该方法就是将数据追加到文件中

        $i = 0;
        $limit = 10;
        //为了防止内存溢出，我们可以一部分一部分放入输出缓冲区
        while (true){
            $user_list = User::skip($i*$limit)->take($limit)->get();
            if(!count($user_list))  break;

            foreach ($user_list as $user){
                 //可以自行修改数据库的数据，以使表格更加人性化
                $str[] = $user->name;
                $str[] = substr($user->email, 0,8);
                $str[] = strtotime($user->email_verified_at);
                $str[] = $user->created_at;
            }
            fputcsv($fp, $str); // 将每次分页获取到的并整理好的数据追加到输出缓冲区内
            unset($str);

            ob_flush(); //循环将数据放入缓冲区后，送出输出缓冲区内容
            flush(); //刷新输出缓冲，flush() 函数不会对服务器或客户端浏览器的缓存模式产生影响。因此，必须同时使用ob_flush（）来刷新输出缓冲

            unset($user_list);
            $i++;

        }

        ob_end_flush(); //输出缓冲区内容并关闭缓冲区（销毁输出缓冲区）
        fclose($fp);
        exit;


    }

}
